package pe.gob.servir.apps.censodirectivo.ejb.service;

import java.util.List;

import javax.ejb.EJB;
import javax.ejb.Stateless;

import org.apache.log4j.Logger;
import org.jboss.ejb3.annotation.Clustered;

import pe.gob.servir.apps.censodirectivo.common.constantes.Constantes;
import pe.gob.servir.apps.censodirectivo.common.util.Utilitario;
import pe.gob.servir.apps.censodirectivo.ejb.dao.CensoDAOLocal;
import pe.gob.servir.apps.censodirectivo.ejb.dao.ConsumirProcedimientoDAOLocal;
import pe.gob.servir.apps.censodirectivo.ejb.dao.EntidadesDAOLocal;
import pe.gob.servir.apps.censodirectivo.excepcion.DAOExcepcion;
import pe.gob.servir.apps.censodirectivo.excepcion.ServiceExcepcion;
import pe.gob.servir.apps.censodirectivo.model.bean.Censo;
import pe.gob.servir.apps.censodirectivo.model.bean.Entidad;
import pe.gob.servir.apps.censodirectivo.model.bean.MensajeRespuesta;
import pe.gob.servir.apps.censodirectivo.model.bean.OpcionCombo;
import pe.gob.servir.apps.censodirectivo.persistence.entity.TblCenso;

/**
 * Session Bean implementation class CensoService
 */
@Stateless
@Clustered
public class CensoService implements CensoServiceRemote, CensoServiceLocal {
	
	private static final Logger log = Logger.getLogger(ResponsableService.class);
	
	@EJB
	private CensoDAOLocal censoDAOLocal;

	@EJB
	private EntidadesDAOLocal entidadesDAOLocal;
	
	@EJB
	private ConsumirProcedimientoDAOLocal consumirProcedimientoDAOLocal;

	public CensoService() {

	}

	@Override
	public MensajeRespuesta registrarCenso(Censo censo) throws ServiceExcepcion {
		MensajeRespuesta mensajeRespuesta = null;
		try {
			mensajeRespuesta = censoDAOLocal.registrarCenso(censo);
		}  catch(DAOExcepcion dEx) {
			log.error("ERROR: DAOExcepcion " + dEx);
			mensajeRespuesta = new MensajeRespuesta(dEx.getCodigoError(), dEx.getMensajeError());
		} catch (Exception e) {
			log.error("ERROR: ServiceExcepcion " + e);
			throw new ServiceExcepcion(Constantes.CODIGO_MSJ_ERROR_NEGOCIO, obtenerMensajeError(Constantes.CODIGO_MSJ_ERROR_NEGOCIO));
		}
		return mensajeRespuesta;
	}
	
	@Override
	public MensajeRespuesta actualizarCenso(Censo censo) throws ServiceExcepcion{
		MensajeRespuesta mensajeRespuesta = null;
		try {
			mensajeRespuesta = censoDAOLocal.actualizarCenso(censo);
		} catch(DAOExcepcion dEx) {
			log.error("ERROR: DAOExcepcion " + dEx);
			mensajeRespuesta = new MensajeRespuesta(dEx.getCodigoError(), dEx.getMensajeError());
		} catch (Exception e) {
			log.error("ERROR: ServiceExcepcion " + e);
			throw new ServiceExcepcion(Constantes.CODIGO_MSJ_ERROR_NEGOCIO, obtenerMensajeError(Constantes.CODIGO_MSJ_ERROR_NEGOCIO));
		}

		return mensajeRespuesta;
	}

	@Override
	public MensajeRespuesta eliminarCenso(Censo censo) throws ServiceExcepcion{
		MensajeRespuesta mensajeRespuesta = null;
		try {
			censoDAOLocal.eliminarCenso(censo.getCensoId(),censo.getUsuarioModificador());
		} catch(DAOExcepcion dEx) {
			log.error("ERROR: DAOExcepcion " + dEx);
			mensajeRespuesta = new MensajeRespuesta(dEx.getCodigoError(), dEx.getMensajeError());
		} catch (Exception e) {
			log.error("ERROR: ServiceExcepcion " + e);
			throw new ServiceExcepcion(Constantes.CODIGO_MSJ_ERROR_NEGOCIO, obtenerMensajeError(Constantes.CODIGO_MSJ_ERROR_NEGOCIO));
		}
		return mensajeRespuesta;
	}

	@Override
	public Censo obtenerCensoPorId(long id) {
		//log.info("CensoService - obtenerCensoPorId");
		TblCenso tblCenso = censoDAOLocal.buscarPorId(id);
		Censo censo = new Censo();
		setCenso(censo,tblCenso);
		return censo;
	}

	@Override
	public List<Censo> filtrarListaCenso(String censo, long nivelGobierno,
			String estado, String fechaInicio, String fechaFin,String anio, String mes) {
		//log.info("ResponsableService - filtrarListaResponsable");
		return censoDAOLocal.filtrarListaCenso(censo, nivelGobierno, estado,
				fechaInicio, fechaFin, anio, mes);
	}

	@Override
	public Censo obtenerCensoPorMesAnio(String mes, String anio) throws ServiceExcepcion {
		Censo censo = null;
		try {

			List<TblCenso> listCenso = censoDAOLocal.obtenerCensoPorMesAnio(mes, anio);
			censo = new Censo();
			
			for(TblCenso tblCenso : listCenso){
				setCenso(censo,tblCenso);
			}
		} catch (DAOExcepcion e) {
			throw new ServiceExcepcion(e.getCodigoError(), e.getMensajeError());
		}
		return censo;
	}
	
	private String obtenerMensajeError(final String codigo){
		 String mensajeError = consumirProcedimientoDAOLocal.consultarMensaje(codigo);
		return mensajeError;
	}
	
	private void setCenso(Censo censo, TblCenso tblCenso){
		censo.setCensoId(tblCenso.getCensoId());
		censo.setNivelGobiernoId(Integer.parseInt(String.valueOf(tblCenso.getNivelGobiernoId())));
		censo.setCenso(tblCenso.getCenso());
		censo.setCensoAbreviatura(tblCenso.getCensoAbreviatura());
		censo.setCensoAnio(tblCenso.getCensoAnio());
		censo.setCensoMes(tblCenso.getCensoMes());
		censo.setFechaInicio(Utilitario.convertDateToString(tblCenso.getFechaInicio(), Constantes.FORMATO_FECHA));
		censo.setFechaFin(Utilitario.convertDateToString(tblCenso.getFechaFin(), Constantes.FORMATO_FECHA));
		censo.setFechaInicioHabilitacion(Utilitario.convertDateToString(tblCenso.getFechaInicioHabilitacion(), Constantes.FORMATO_FECHA));
		censo.setFechaFinHabilitacion(Utilitario.convertDateToString(tblCenso.getFechaFinHabilitacion(), Constantes.FORMATO_FECHA));
		censo.setDiasAlertaResponsable(Integer.parseInt(String.valueOf(tblCenso.getDiasAlertaResponsable())));
		censo.setFechaInicioRegistro(Utilitario.convertDateToString(tblCenso.getFechaInicioRegistro(), Constantes.FORMATO_FECHA));
		censo.setFechaFinRegistro(Utilitario.convertDateToString(tblCenso.getFechaFinRegistro(),Constantes.FORMATO_FECHA));
		censo.setFechaFinAmpliacion(Utilitario.convertDateToString(tblCenso.getFechaFinAmpliacion(),Constantes.FORMATO_FECHA));
		censo.setDiasAlertaDirectivo(Integer.parseInt(String.valueOf(tblCenso.getDiasAlertaDirectivo())));
		censo.setFechaCreacion(Utilitario.convertDateToString(tblCenso.getFechaCreacion(), Constantes.FORMATO_FECHA));
		censo.setFechaModificacion(Utilitario.convertDateToString(tblCenso.getFechaModificacion(),Constantes.FORMATO_FECHA));
		censo.setUsuarioCreador(tblCenso.getUsuarioCreador());
		censo.setUsuarioModificador(tblCenso.getUsuarioModificador());
		censo.setEstadoRegistro(tblCenso.getEstadoRegistro());
		censo.setEstadoCensoId(tblCenso.getEstadoCensoId());
	}

	@Override
	public MensajeRespuesta finalizarDirectivo(long directivoId) throws ServiceExcepcion {
		try {
			return censoDAOLocal.finalizarDirectivo(directivoId);	
		} catch (DAOExcepcion e) {
			throw new ServiceExcepcion(e.getCodigoError(), e.getMensajeError());
		}
		
	}

	@Override
	public MensajeRespuesta finalizarResponsable(long responsableId) throws ServiceExcepcion {
		try {
			return censoDAOLocal.finalizarResponsable(responsableId);
		} catch (DAOExcepcion e) {
			throw new ServiceExcepcion(e.getCodigoError(), e.getMensajeError());
		}
		
	}
	
	@Override
	public List<OpcionCombo> buscarEntidadxCenso(Integer censoId) throws ServiceExcepcion {
		try {
			return censoDAOLocal.buscarEntidadxCenso(censoId);
		} catch (DAOExcepcion e) {
			throw new ServiceExcepcion(e.getCodigoError(), e.getMensajeError());
		}
			
	}

	@Override
	public List<Entidad> filtrarListaEntidad(Entidad entidad)
			throws ServiceExcepcion {
		try {
			return entidadesDAOLocal.filtrarListaEntidad(
					String.valueOf(entidad.getNumeroRUC()),
					String.valueOf(entidad.getNombreEntidad()),
					String.valueOf(entidad.getNivelGobiernoId()),
					String.valueOf(entidad.getTipologiaEntidadId()),
					String.valueOf(entidad.getTipoEntidadId()),
					String.valueOf(entidad.getSectorEntidadId()),
					String.valueOf(entidad.getClasificacionEntidadId()));
		} catch (DAOExcepcion e) {
			throw new ServiceExcepcion(e.getCodigoError(), e.getMensajeError());
		}
	}

	@Override
	public MensajeRespuesta registrarEntidad(Entidad entidad) throws ServiceExcepcion {
		MensajeRespuesta mensajeRespuesta = null;
		log.info("registrarEntidad - Parametros de entrada : " + entidad.toString());
		try {
			mensajeRespuesta = entidadesDAOLocal.registrarEntidad(entidad);
		} catch(DAOExcepcion dEx) {
			mensajeRespuesta = new MensajeRespuesta(dEx.getCodigoError(), dEx.getMensajeError());
		} catch (Exception e) {
			throw new ServiceExcepcion(Constantes.CODIGO_MSJ_ERROR_NEGOCIO, obtenerMensajeError(Constantes.CODIGO_MSJ_ERROR_NEGOCIO));
		}

		return mensajeRespuesta;
	}

	@Override
	public MensajeRespuesta editarEntidad(Entidad entidad) throws ServiceExcepcion {
		try {
			return entidadesDAOLocal
					.actualizarEntidad(entidad.getIdEntidad(), entidad.getNumeroRUC(), entidad.getNombreEntidad(),
							entidad.getNombreComercialEntidad(), entidad.getIdEntidadPadre(), entidad.getUbigeo(), entidad.getHabilitaEntidad(),
							entidad.getDirecccionLegal(), entidad.getDescActiviEcono(), entidad.getTelefono1(), entidad.getTelefono2(),
							entidad.getFechaAlta(), entidad.getFechaBaja(), entidad.getEmail1(), entidad.getEmail2(),
							entidad.getFechaConstitucionEntidad(), entidad.getFechaInicioActividad(),
							entidad.getNumeroDocumentoRepreLegalEntidad(), entidad.getFlagValidadoSunat(),
							entidad.getEstadoEntidad(), entidad.getNivelGobiernoId(), entidad.getSectorEntidadId(),
							entidad.getCodigoSector(), entidad.getClasificacionEntidadId(),
							entidad.getTipologiaEntidadId(), entidad.getTipoEntidadId(), entidad.getAbreviatura(),
							entidad.getObservacion(), entidad.getPia(), entidad.getPaginaWeb(), entidad.getReferencia(), entidad.getCue(),
							entidad.getUsuarioCreador(), entidad.getEstadoRegistro());
		} catch (DAOExcepcion e) {
			throw new ServiceExcepcion(e.getCodigoError(), e.getMensajeError());
		}
	}

	@Override
	public Entidad obtenerPorIdEntidad(long id) throws ServiceExcepcion {
		try {
			return entidadesDAOLocal.obtenerPorIdEntidad(id);
		} catch (DAOExcepcion e) {
			throw new ServiceExcepcion(e.getCodigoError(), e.getMensajeError());
		}
	}

}
